import smartEnumWrapper from '@/constants'
import { FLAG_NUMBER_ENUM } from '@/constants/system/common-const'
import _ from 'lodash'
export const useEnums = () => {
    /**
     * 根据枚举值获取描述
     * @param {*} constantName 枚举名
     * @param {*} value          枚举值
     * @returns
     */
    function getDescByValue(constantName: string, value: any): string {
        if (!smartEnumWrapper || !Object.prototype.hasOwnProperty.call(smartEnumWrapper, constantName)) {
            console.error('无法找到变量名称：' + constantName + '，请检查 /constants/index.js 文件中是否引入此变量！')
            return ''
        }
        // boolean类型需要做特殊处理
        if (constantName === 'FLAG_NUMBER_ENUM' && !_.isUndefined(value) && typeof value === 'boolean') {
            value = value ? FLAG_NUMBER_ENUM.TRUE.value : FLAG_NUMBER_ENUM.FALSE.value
        }

        let smartEnum: SmartEnum<string | number> = smartEnumWrapper[constantName]
        for (let item in smartEnum) {
            if (smartEnum[item].value === value) {
                return smartEnum[item].desc
            }
        }
        return ''
    };

    /**
     * 根据枚举名获取对应的描述键值对[{value:desc}]
     * @param {*} constantName 枚举名
     * @returns
     */
    function getValueDescList<T>(constantName: string): SmartEnumItem<T>[] {
        if (!Object.prototype.hasOwnProperty.call(smartEnumWrapper, constantName)) {
            console.error('无法找到变量名称：' + constantName + '，请检查 /constants/index.js 文件中是否引入此变量！')
            return []
        }
        const result: SmartEnumItem<T>[] = []
        let targetSmartEnum = smartEnumWrapper[constantName]
        for (let item in targetSmartEnum) {
            result.push(targetSmartEnum[item] as any)
        }
        return result
    };

    /**
     * 根据枚举名获取对应的value描述键值对{value:desc}
     * @param {*} constantName 枚举名
     * @returns
     */
    function getValueDesc(constantName: string): { [key: string]: string } {
        if (!Object.prototype.hasOwnProperty.call(smartEnumWrapper, constantName)) {
            console.error('无法找到变量名称：' + constantName + '，请检查 /constants/index.js 文件中是否引入此变量！')
            return {}
        }
        let smartEnum = smartEnumWrapper[constantName]
        let result = {} as { [key: string]: string }
        for (let item in smartEnum) {
            let key: string = smartEnum[item].value + ''
            result[key] = smartEnum[item].desc
        }
        return result
    };
    return {
        getDescByValue,
        getValueDescList,
        getValueDesc
    }
}